<?php
/**
 * 图片处理相关操作
 * 图片统一处理为jpeg格式，便于使用；处理生成动态图片(gif)见 AnimateImageHelper
 *
 *
 * @author xyma
 *
 */
class ImageHelper
{
	static $quality	=	83;	//图片清晰度
	
	/**
	 * 生成缩略图
	 *
	 * @param $srcfile	string	源图片路径
	 * @param $width	int		最大宽
	 * @param $height	int		最大高
	 * @param $dstfile	string	缩略图存储位置，空则返回缩略图内容
	 * @return false|string
	 */
	static function thumb($srcfile, $width, $height, $dstfile=null)
	{
		if(empty($width) && empty($height))   //缩略图宽高不指定直接返回源图
		{
			return false;
		}

		// 获取原图信息
		$info  = self::getImageInfo($srcfile);
		if($info === false){
			return false;
		}
		
		$srcWidth	=	$info['width'];
		$srcHeight	=	$info['height'];
		$o_type		=   strtolower($info['type']);
		unset($info);

		// 计算缩放比例
		if(empty($height))
		{
			$scale	  =   $width/$srcWidth;
			$height  	=   intval($srcHeight * $scale);
		}
		elseif(empty($width))
		{
			$scale	  =   $height/$srcHeight;
			$width   =   intval($srcWidth * $scale);
		}
		else
		{
			$scale	  =   min($width/$srcWidth, $height/$srcHeight);
		}

		// 缩略图尺寸
		$width  = (int)($srcWidth*$scale);
		$height = (int)($srcHeight*$scale);

		// 载入原图
		$createFun = 'ImageCreateFrom'.($o_type=='jpg'?'jpeg':$o_type);
		$srcImg	 = $createFun($srcfile);

		//创建缩略图
		if(function_exists('imagecreatetruecolor'))
			$thumbImg = imagecreatetruecolor($width, $height);
		else
			$thumbImg = imagecreate($width, $height);

		// 复制图片
		if(function_exists("ImageCopyResampled"))
			ImageCopyResampled($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth,$srcHeight);
		else
			ImageCopyResized($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height,  $srcWidth,$srcHeight);
		
		//启用隔行扫描
		if(app_cfg('imgcfg', 'interlace_pic')){
			imageinterlace($thumbImg, 1);
		}
		ImageDestroy($srcImg);
		
		if(!$dstfile)	// 返回图片内容
		{
			$dstfile	=	tempnam(TMP_PATH, 'thumb_');
			imagejpeg($thumbImg, $dstfile, self::$quality);
			$dststring	=	file_get_contents($dstfile);
			
			unlink($dstfile);
			ImageDestroy($thumbImg);
			
			return $dststring;
		}
		else			// 生成图片到指定文件
		{
			imagejpeg($thumbImg, $dstfile, self::$quality);
			ImageDestroy($thumbImg);
			return true;
		}
		
	}
	
	/**
	 * 取图片文件信息
	 *
	 * @param $img	string	图片路径
	 * @return bool|array
	 */
	static function getImageInfo($img)
	{
		$imageInfo = getimagesize($img);
		if( $imageInfo!== false) {
			$imageType = strtolower(substr(image_type_to_extension($imageInfo[2]),1));
			$imageSize = filesize($img);
			$info = array(
				"width"=>$imageInfo[0],
				"height"=>$imageInfo[1],
				"type"=>$imageType,
				"size"=>$imageSize,
				"mime"=>$imageInfo['mime']
			);
			return $info;
		}else {
			return false;
		}
	}
	
	/**
	 * 只是将转换图片格式为jpeg，保持原始尺寸
	 *
	 * @return bool
	 */
	static function convert($srcimg, $dstimg)
	{
		$info  =	self::getImageInfo($srcimg);
		if(!$info){
			return false;
		}
		
		$o_type	=	strtolower($info['type']);
		if($o_type=='jpg' || $o_type=='jpeg')
		{
			file_put_contents($dstimg, file_get_contents($srcimg));
			return true;
		}
		
		//读源图
		$createFun	=	'ImageCreateFrom'.$o_type;
		$srcImg		=	$createFun($srcimg);

		//创建jpeg图
		if(function_exists('imagecreatetruecolor')){
			$thumbImg = imagecreatetruecolor($info['width'], $info['height']);
		}
		else{
			$thumbImg = imagecreate($info['width'], $info['height']);
		}
		
		// 复制图片
		if(function_exists("ImageCopyResampled")){
			ImageCopyResampled($thumbImg, $srcImg, 0, 0, 0, 0, $info['width'], $info['height'], $info['width'], $info['height']);
		}
		else{
			ImageCopyResized($thumbImg, $srcImg, 0, 0, 0, 0, $info['width'], $info['height'], $info['width'], $info['height']);
		}
		//启用隔行扫描
		if(app_cfg('imgcfg', 'interlace_pic')){
			imageinterlace($thumbImg, 1);
		}

		imagejpeg($thumbImg, $dstimg, self::$quality);
		
		ImageDestroy($thumbImg);
		ImageDestroy($srcImg);
		
		return true;
	}
	
}
?>